"""
封装的函数的优化：
1、记录日志： 方便问题定位 看到执行过程 == 但凡print看结果 或者debug看结果的地方都记录日志

优化：
定义参数 token 设置默认值None 因为有些时间不需要传token。

原始header= '{ "Content-Type": "multipart/form-data",
"Authorization":"bearerbbe67d27-972a-4474-86f2-9f8bc197a016"}'
现在需要在这个头部里 替换调用token值  通过参数传进来值。
"""

import json

import allure
import requests
from tools.handle_path import file_path
from tools.handle_replace import replace_mark
from tools.handle_extract import extract_response
from tools.handle_presql import pre_sql
from loguru import logger

@allure.step("发送接口请求")
def requests_api(case,token=None):
    method = case["请求方法"]
    url = case["接口地址"]
    header = case["请求头"]
    param = case["请求参数"]
    presql = case["前置SQL"]
    # 执行前置SQL之前，还要替换一下占位符 调用replace_mark方法
    presql = replace_mark(presql)
    # 在请求参数替换之前 执行前置sql
    pre_sql(presql)

    # 调用替换函数 替换头部 和参数 URL地址里的占位符
    header = replace_mark(header) #替换头部并把提花能完成后的字符串成赋值给变量header
    param = replace_mark(param)#替换参数并把提能完成后的字符串成赋值给变量param
    url = replace_mark(url) #替换url地址占位符并替换后的字符串成赋值给变量url

    # 发送接口请求之前，头部和参数需要做反序列操作 转化为字典
    #因为有些接口没有请求头 /没有请求参数，所以在json.loads反序列化之前，要判空
    if header is not None:
        header = json.loads(header) # 字典
        # 如果token有参数传进来 not None,增加|修改 Authorization的值。
        if token is not None:
            header["Authorization"] = token
    if param is not None:
        param = json.loads(param)  # 转化为字典了
    # 发送接口请求之前，接口请求方法有get post put等 各种方法都要支持,转化为小写之后再比对
    #记录请求数据的日志
    logger.info("----------------请求消息----------------------")
    logger.info(f"请求方法是：{method}")
    logger.info(f"请求url是：{url}")
    logger.info(f"请求头部是：{header}")
    logger.info(f"请求参数是：{param}")
    resp = None # 避免警告 可以在最开始给他一个默认None
    if method.lower() == "get":
        resp = requests.request(method=method,url=url,headers=header,params=param)
    elif method.lower() == "post":
        # 如果是post方法： 根据content-type类型判断用什么接受参数：
        if header["Content-Type"]=="application/json":
            resp = requests.request(method=method, url=url, headers=header, json=param)
        if header["Content-Type"] == "application/x-www-form-urlencoded":
            resp = requests.request(method=method, url=url, headers=header, data=param)
        if header["Content-Type"] == "multipart/form-data":
            # 如果是上传的接口，一定不要加content-type头部  删除这个头部
            header.pop("Content-Type")  # 要删除content-type字段头部
            filename = param["filename"]
            # 做上传的文件的路径处理 : file_path/filename
            file_obj = {"file": open(file_path/filename, "rb")}
            resp = requests.request(method=method, url=url, headers=header, files=file_obj)
    elif method.lower() == "put":
        resp = requests.request(method=method, url=url, headers=header, json=param)
    # 记录响应消息的日志
    logger.info("----------------响应消息----------------------")
    logger.info(f"响应状态码：{resp.status_code}")
    logger.info(f"响应体是：{resp.text}")
    # 得到响应消息之后 提取数据  调用提取函数
    extract_response(resp,case["提取响应字段"])
    return resp